package logica;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.Properties;

import logica.VO.VOAvion;
import logica.VO.VOBlindado;
import logica.VO.VOCheckStatus;
import logica.VO.VODisparo;
import logica.VO.VODrone;
import logica.VO.VOEscenario;
import logica.VO.VOListarPartidas;
import logica.VO.VOMensaje;
import logica.VO.VOObstaculo;
import logica.VO.VOPartida;
import logica.VO.VOPartidaResumida;
import logica.VO.VOPersonaje;
import logica.VO.VOPersonajes;
import logica.VO.VOPiloto;
import logica.VO.VOPlayer1;
import logica.VO.VOPlayer2;
import logica.VO.VORefresh;
import persistencia.consultas.Consultas;
import persistencia.daos.DAOEscenarios;
import persistencia.daos.DAOPartidas;
import persistencia.daos.DAOPersonajes;

public class Fachada {

	private static Fachada instancia;
	private static Partida partida;
	
	private Fachada() {
		//obtener info de project.properties
		try {
			Properties props = new Properties();
			String nomArch = "project.properties";
			props.load(new FileInputStream(nomArch));
			Class.forName(props.getProperty("driver")).newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static Fachada getInstancia()
	{
		if (instancia == null)
				instancia = new Fachada();
		return instancia;
	}
	
	public VOPartida nuevaPartida(String nombrePartida){
		VOPartida voPartida = new VOPartida();
		try{
			DAOPartidas partidas = new DAOPartidas();
			int nuevoIndex =  partidas.getLastIndex()+1;
			partida = new Partida(nuevoIndex, nombrePartida);

			//se crean los VO
			VOEscenario voEscenario = new VOEscenario(partida.getEscenario().getId(), partida.getEscenario().getNombreImagen(), partida.getEscenario().getObstaculos());
			
			VOPlayer1 voP1 = new VOPlayer1(1, 0, (Piloto)partida.getJugador(0).getPersonajes().getPersonaje(0), (Avion)partida.getJugador(0).getPersonajes().getPersonaje(1), (Drone)partida.getJugador(0).getPersonajes().getPersonaje(2));

			VOPlayer2 voP2 = new VOPlayer2(2, 0, (Blindado)partida.getJugador(1).getPersonajes().getPersonaje(0), (Blindado)partida.getJugador(1).getPersonajes().getPersonaje(1));
			
			voPartida = new VOPartida(nuevoIndex, voEscenario, voP1, voP2, partida.isPausa(), partida.isTerminada(), false, "");
		}catch(Exception e){
			e.printStackTrace();
			File currentDirectory = new File(new File(".").getAbsolutePath());
			try {
				System.out.println(currentDirectory.getCanonicalPath());
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			System.out.println(currentDirectory.getAbsolutePath());
			voPartida.setHayError(true);
			voPartida.setMsjError(e.getMessage());
			
		}
			
			return voPartida;
	}
	
	public VOPartida unirsePartida(){
		Escenario es = partida.getEscenario();
		VOEscenario voEscenario = new VOEscenario(es.getId(), es.getNombreImagen(), es.getObstaculos());
		Piloto p = (Piloto)partida.getJugadores()[0].getPersonajes().getPersonaje(0);
		Avion a = (Avion)partida.getJugadores()[0].getPersonajes().getPersonaje(1);
		Drone d = (Drone)partida.getJugadores()[0].getPersonajes().getPersonaje(2);
		VOPlayer1 voP1 = new VOPlayer1(1, 0, p, a, d);
		Blindado blindado1 = (Blindado)partida.getJugadores()[1].getPersonajes().getPersonaje(0);
		Blindado blindado2 = (Blindado)partida.getJugadores()[1].getPersonajes().getPersonaje(1);
		VOPlayer2 voP2 = new VOPlayer2(2, 0, blindado1, blindado2);
		partida.setIniciada(true);
		partida.setPausa(false);
		VOPartida voPartida = new VOPartida(partida.getId(), voEscenario, voP1, voP2, partida.isPausa(), partida.isTerminada(), false, "");
		
		return voPartida;
	}
	
	public VORefresh refresh(int idJugador, int idPersonaje, float x, float y, boolean hayDisparo, String direccion){
		//seteos llamador
		int idActual = idJugador-1;

		return partida.refresh(idActual, idPersonaje, x, y, hayDisparo, direccion);
	}
	
	public VOMensaje pausa(boolean pausa){
		if(partida.isIniciada() == true)
			partida.setPausa(pausa);
		VOMensaje mensaje = new VOMensaje(false, "");
		return mensaje;
	}
	
	public VOCheckStatus checkStatus(){
		VOCheckStatus check = new VOCheckStatus();
		if(partida != null){
			if(partida.isTerminada() == true){
				check.setCreada(false);
				check.setIniciada(false);
			}else{
				check.setCreada(true);
				check.setIniciada(partida.isIniciada());
			}
		}else{
			check.setCreada(false);
			check.setIniciada(false);
		}
		check.setHayError(false);
		check.setMsjError("");
		
		return check;
	}
	
	public VOMensaje impacto(int idJugador, int idImpactado, boolean esPersonaje, boolean esAmigo, boolean esBomba){
		return partida.impacto(idJugador, idImpactado, esPersonaje, esAmigo, esBomba);
	}
	
	public VOMensaje drone(boolean activado){
		return partida.drone(activado);
	}
	
	public VOMensaje guardarPartida(){
		DAOPartidas partidas = new DAOPartidas();
		VOMensaje mensaje = new VOMensaje(false, "");
		try {
			partidas.insert(partida);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mensaje.setHayError(true);
			mensaje.setMsjError(e.getMessage());
		}
		return mensaje;
	}
	
	public VOPartida cargarPartida(int idPartida){
		VOPartida voPartida = new VOPartida();
		try{
			DAOPartidas partidas = new DAOPartidas();
			this.partida = partidas.find(idPartida);
			//se crean los VO
			VOEscenario voEscenario = new VOEscenario(partida.getEscenario().getId(), partida.getEscenario().getNombreImagen(), partida.getEscenario().getObstaculos());
			
			VOPlayer1 voP1 = new VOPlayer1(1, 0, (Piloto)partida.getJugador(0).getPersonajes().getPersonaje(0), (Avion)partida.getJugador(0).getPersonajes().getPersonaje(1), (Drone)partida.getJugador(0).getPersonajes().getPersonaje(2));

			VOPlayer2 voP2 = new VOPlayer2(2, 0, (Blindado)partida.getJugador(1).getPersonajes().getPersonaje(0), (Blindado)partida.getJugador(1).getPersonajes().getPersonaje(1));
			
			voPartida = new VOPartida(partida.getId(), voEscenario, voP1, voP2, true, false, false, "");
		}catch(Exception e){
			e.printStackTrace();
			File currentDirectory = new File(new File(".").getAbsolutePath());
			try {
				System.out.println(currentDirectory.getCanonicalPath());
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			System.out.println(currentDirectory.getAbsolutePath());
			voPartida.setHayError(true);
			voPartida.setMsjError(e.getMessage());
			
		}
			
			return voPartida;
	}
	
	public VOListarPartidas listarPartidas(){
		DAOPartidas partidas = new DAOPartidas();
		try {
			return partidas.listarPartidas();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		
	}
	
	public VOMensaje terminarPartida(){
		partida.setTerminada(true);
		partida.setPausa(true);
		partida.setIniciada(false);
		VOMensaje mensaje = new VOMensaje(false, "");
		return mensaje;
	}
	
	public VOPartida cambioPersonaje(int idJugador, int idPersonaje){
		return partida.cambioPersonaje(idJugador-1, idPersonaje);
	}

}
